

function http(params) {

  const { baseURL } = http.defaults

  params.url = baseURL + params.url

  return new Promise((reslove, reject) => {

    params = http.interceptors.request(params)

    http.queue.length === 0 && wx.showLoading({
      title: '正在加载...',
      mask: true
    })

    params.success = (res) => {

      reslove(http.interceptors.response(res))
    }

    params.fail = (err) => {
      reject(err)
    }

    // 等待请求完成后会调用 complete 回调函数
    params.complete = () => {
      // console.log('请求结束了...')
      // 调用 API 隐藏掉加载提示框

      // 当请求结束后，将数组 http.queue 长度减 1
      http.queue.pop()

      // 当所有请求都结束后，http.queue 长度会再次为 0
      http.queue.length === 0 && wx.hideLoading()
    }

    // 向数组 http.queue 中追加新的单元
    // 有几次请求数组就会有几个单元
    http.queue.push('loading')

    // 发起请求
    wx.request(params)
  })

}

// 定义数组记录请求的数量
http.queue = []

// 定义 defaults 对象，用来存 http 的默认参数
http.defaults = {
  baseURL: 'https://liuxue.tointe.com/api'
}

// 定义拦截器
http.interceptors = {

  // 请求拦截器
  request(params) {
    // console.log(params)

    // 在内部处理数据
    return Object.assign({}, params, {
      header: {
        cookie: "sessionid=" + wx.getStorageSync('sessionid')
      }
    })
  },

  // 响应拦截器
  response(res) {
    // console.log(res)
    if (res.statusCode === 200 && res.cookies.length) {
      res.cookies[0].split('; ').forEach(v => {
        let [k, val] = v.split('=')
        if (k === 'sessionid') {
          wx.setStorageSync('sessionid', val)
        }
      })
    }

    if (res.data.success) {
      return res.data
    } else {
      wx.showToast({
        title: res.data.message,
        icon: 'none',
        duration:5000
      });
      if (res.data.message == '请先登录') {
        setTimeout(v => {
          wx.navigateTo({
            url: "/pages/login/login"
          })
        }, 1000)
        wx.clearStorageSync()
      }
      return Promise.reject(res.data)
    }

  }

}

// 并发处理
http.all = (...promises) => {
  return Promise.all(promises)
}

// 快捷方法（专门用于 get 请求）
http.get = (url, data = {}) => {
  return http({
    url,
    method: 'get',
    data
  })
}

// 快捷方法（专门用于 post 请求）
http.post = (url, data = {}) => {
  return http({
    url,
    method: 'post',
    data
  })
}

// 导出 http 函数
export default http